// @algorithm @lc id=100290 lang=cpp
// @title biao-shi-shu-zhi-de-zi-fu-chuan-lcof

#include "algm/algm.h"
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class Solution {
public:
    bool isNumber(string s) {
        // 指示是否有e或E
        bool eFlag = false;
        int n = s.length();
        // 指示去除首尾空格之后的字符串起始位置
        int begin_pos = 0, end_pos = n - 1;
        // 如果有e或E，指示e或E的位置
        int e_pos;
        // 去除首尾空格
        while (begin_pos < n && s[begin_pos] == ' ') {
            ++begin_pos;
        }
        while (end_pos >= 0 && s[end_pos] == ' ') {
            --end_pos;
        }
        // 如果除了首尾空格没有别的元素，则false
        if (begin_pos > end_pos) {
            return false;
        }
        // 找e或E的位置，如果出现多个e或E，直接false
        for (int i = 0; i < n; ++i) {
            if (s[i] == 'e' || s[i] == 'E') {
                if (!eFlag) {
                    eFlag = true;
                    e_pos = i;
                }
                else {
                    return false;
                }
            }
        }
        // 如果出现e或E，则判断e前面的是否为小数或整数，e后面的是否为整数
        if (eFlag) {
            return (isInteger(s.substr(begin_pos, e_pos - begin_pos)) ||
                    isDecimal(s.substr(begin_pos, e_pos - begin_pos))) &&
                   (isInteger(s.substr(e_pos + 1, end_pos - e_pos)));
        }
        // 如果没e，判断整个字符串是否为小数或整数
        else {
            return isInteger(s.substr(begin_pos, end_pos - begin_pos + 1)) ||
                   isDecimal(s.substr(begin_pos, end_pos - begin_pos + 1));
        }
    }

    // 判断是否为整数
    bool isInteger(string s) {
        // 空串返回false
        if (s.length() == 0) {
            return false;
        }
        auto it = s.begin();
        // 第一位为+-则直接跳过
        if (*it == '+' || *it == '-') {
            ++it;
            // 如果跳过之后结束了，没有数字，则直接false
            if (it == s.end()) {
                return false;
            }
        }
        // 出现数字之外的其他数，则false
        while (it != s.end()) {
            if (*it >= '0' && *it <= '9') {
                ++it;
            }
            else {
                return false;
            }
        }
        return true;
    }

    // 判断是否为小数
    bool isDecimal(string s) {
        if (s.length() == 0) {
            return false;
        }
        // 指示小数点是否出现
        bool dotFlag = false;
        auto it = s.begin();
        if (*it == '+' || *it == '-') {
            ++it;
        }
        // 如果先碰见小数点，则需要判断后面是否还有数字，如果下一个不是数字，就false
        if (*it == '.') {
            dotFlag = true;
            if (*(it + 1) < '0' || *(it + 1) > '9') {
                return false;
            }
            ++it;
        }
        while (it != s.end()) {
            if (*it >= '0' && *it <= '9') {
                ++it;
            }
            else if (*it == '.') {
                // 判断是否有重复小数点
                if (dotFlag) {
                    return false;
                }
                else {
                    dotFlag = true;
                    ++it;
                }
            }
            else {
                return false;
            }
        }
        return dotFlag;
    }
};